#include "head.h"
#include "login.h"

// 猜数字小游戏
void guess_number()
{
    srand(time(NULL));     // 使用当前时间作为随机种子
    int continue_flag = 1; // 定义是否继续游戏标识符
    while (continue_flag)
    {
        system("clear");
        int rand_num = rand() % 100 + 1; // 生成1到100之间的随机数
        int num;
        int min = 1;   // 最小值
        int max = 100; // 最大值
        printf("欢迎来到猜数字小游戏,请你输入[1-100]之间的数字开始游戏\n");
        while (1)
        {
            scanf("%d", &num);
            if (num > 100 || num < 1)
            {
                printf("你输入的数字无效!请重新输入:\n");
                continue;
            }
            if (num == rand_num)
            {
                printf("恭喜这位帅哥猜对了!你真是绝顶聪明!\n");
                puts("1-继续游戏\t0-退出游戏至菜单");
                scanf("%d", &continue_flag);
                if (continue_flag == 0)
                {
                    return;
                }
                break;
            }
            else if (num > rand_num)
            {
                printf("大了,在[%d,%d]之间,请重新输入:\n", min, num);
            }
            else
            {
                printf("小了,在[%d,%d]之间,请重新输入:\n", num, max);
            }
        }
    }
}

// 可控金字塔游戏
void pyramid()
{
    int contiue_flag = 1; // 游戏是否继续标识符
    while (contiue_flag)
    {
        system("clear");
        int h; // 金字塔层数
        puts("欢迎来到可控金字塔游戏!");
        printf("请输入你的金字塔高度:");
        scanf("%d", &h);
        for (int i = 1; i <= h; i++)
        {
            print_k(h - i); // 先打印空格,再打印*
            print_x(2 * i - 1);
            puts("");
        }
        puts("");
        puts("1-继续游戏\t0-退出游戏至菜单");
        scanf("%d", &contiue_flag);
        if (contiue_flag == 0)
        {
            return;
        }
    }
}
// 打印*
void print_x(int num)
{
    for (int i = 0; i < num; i++)
    {
        printf("*");
    }
}
// 打印空格
void print_k(int num)
{
    for (int i = 0; i < num; i++)
    {
        printf(" ");
    }
}

// 打印用户信息
void print_users_info(user *struct_arr, int lenth)
{
    printf("姓名\t\t成绩\t\t等级\t\t排名\n");
    for (int i = 0; i < lenth; i++)
    {
        printf("%s\t\t%d\t\t%c\t\t%d\n", struct_arr[i].user_name, struct_arr[i].grade, struct_arr[i].level, struct_arr[i].rank);
    }
}

// 随机生成学生成绩
void make_grades(user *struct_arr, int lenth)
{
    srand(time(NULL)); // 使用当前时间作为随机种子， 要在循环外面，否则随机数会相同
    for (int i = 0; i < lenth; i++)
    {
        int rand_grade = rand() % 100;    // 生成0到100之间的随机数
        struct_arr[i].grade = rand_grade; // 将随机成绩分配给每个成员
    }
    // 打印学生信息
    print_users_info(struct_arr, lenth);

    // 选择对学生成绩的操作
    int flag = 1;
    while (flag)
    {
        int choice;
        puts("请选择对学生成绩的操作");
        puts("1-给学生成绩排等级\n2-给学生成绩排序\n3-给学生成绩排序排等级\n4-返回菜单");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            level_grade(struct_arr, lenth);
            print_users_info(struct_arr, lenth);
            puts("");
            puts("1-继续\t\t0-返回菜单");
            scanf("%d", &flag);
            if (flag == 0)
            {
                return;
            }
            break;
        case 2:
            rank_grade(struct_arr, lenth);
            puts("");
            puts("1-继续\t\t0-返回菜单");
            scanf("%d", &flag);
            if (flag == 0)
            {
                return;
            }
            break;
        case 3:
            level_grade(struct_arr, lenth);
            rank_grade(struct_arr, lenth);
            puts("");
            puts("1-继续\t\t0-返回菜单");
            scanf("%d", &flag);
            if (flag == 0)
            {
                return;
            }
            break;
        case 4:
            return;
        }
    }
}

// 根据学生成绩排等级
void level_grade(user *struct_arr, int lenth)
{
    // 依次循环给学生成绩排等级
    for (int i = 0; i < lenth; i++)
    {
        if (struct_arr[i].grade >= 90)
        {
            struct_arr[i].level = 'A';
        }
        if (struct_arr[i].grade >= 80 && struct_arr[i].grade < 90)
        {
            struct_arr[i].level = 'B';
        }
        if (struct_arr[i].grade >= 70 && struct_arr[i].grade < 80)
        {
            struct_arr[i].level = 'C';
        }
        if (struct_arr[i].grade >= 60 && struct_arr[i].grade < 70)
        {
            struct_arr[i].level = 'E';
        }
        if (struct_arr[i].grade < 60)
        {
            struct_arr[i].level = 'F';
        }
    }
}

// 根据学生成绩排序
void rank_grade(user *struct_arr, int lenth)
{
    // 降序冒泡排序
    user temp_user;                     // 临时用户结构体,用户交换结构体数据
    for (int i = 0; i < lenth - 1; i++) // 控制趟数
    {
        for (int j = 0; j < lenth - 1 - i; j++) // 控制交换次数
        {
            if (struct_arr[j].grade < struct_arr[j + 1].grade)
            {
                // 交换学生里面的所有信息
                temp_user = struct_arr[j];
                struct_arr[j] = struct_arr[j + 1];
                struct_arr[j + 1] = temp_user;
            }
        }
    }
    // 将排名写入到学生信息中去
    for (int k = 0; k < lenth; k++)
    {
        struct_arr[k].rank = k + 1;
    }
    print_users_info(struct_arr, lenth);
}

